package com.baomidou.mybatisplus.generator;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.builder.GeneratorBuilder;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;

import java.util.Scanner;

/**
 * 抽象代码生成器示例
 *
 * @author hubin
 * @since 2021-02-08
 */
public abstract class SimpleAutoGeneratorExample {
    /**
     * 读取控制台输入内容
     */
    private final Scanner scanner = new Scanner(System.in);

    /**
     * 控制台输入内容读取并打印提示信息
     *
     * @param message 提示信息
     * @return
     */
    public String scannerNext(String message) {
        System.out.println(message);
        return scanner.next();
    }


    /**
     * 执行代码生成
     */
    public void execute() {
        // 执行开始
        this.start();

        // 初始化配置数据源
        new AutoGenerator(this.configBuilder(dataSourceConfigBuilder()))
                // 全局配置
                .global(this.configBuilder(globalConfigBuilder()))
                // 模板配置
                .template(this.configBuilder(templateConfigBuilder()))
                // 包配置
                .packageInfo(this.configBuilder(packageConfigBuilder()))
                // 策略配置
                .strategy(this.configBuilder(strategyConfigBuilder()))
                // 执行
                .execute(this.templateEngine());
    }

    protected <T> T configBuilder(IConfigBuilder<T> configBuilder) {
        return null == configBuilder ? null : configBuilder.build();
    }

    /**
     * 执行开始
     */
    public void start() {
        System.out.println("！！！执行代码自动生成开始！！！");
    }

    /**
     * 数据源配置 Builder
     */
    public IConfigBuilder<DataSourceConfig> dataSourceConfigBuilder() {
        return new DataSourceConfig.
            Builder("jdbc:mysql://127.0.0.1:3306/ttest?serverTimezone=UTC","root","123456")
            ;
    }

    ;

    /**
     * 全局配置 Builder
     */
    public IConfigBuilder<GlobalConfig> globalConfigBuilder() {

        return GeneratorBuilder.globalConfigBuilder()
            .fileOverride()//默不覆盖,调用此方法，表示覆盖已生成文件
            .openDir(true)//是否打开生成目录
            .enableSwagger2()//默认不生成，调用此方法，表示生成swagger2注解
            .outputDir("F:/temp/genetor/auth")//指定输出目录
            .author("xuxk").dateType(DateType.TIME_PACK).commentDate("yyyy-MM-dd");
    }

    /**
     * 生成文件包名配置 Builder
     */
    public IConfigBuilder<PackageConfig> packageConfigBuilder() {
//        return new PackageConfig.Builder().parent(scannerNext("\n请输入项目包名：")).moduleName(scannerNext("\n请输入项目模块名："));
        return new PackageConfig.Builder().parent("com.abu.zx");
    }

    /**
     * 自定义模板配置 Builder
     */
    public IConfigBuilder<TemplateConfig> templateConfigBuilder() {
        return new TemplateConfig.Builder().disable(TemplateType.ENTITYKT)//禁用ENTITYKT

            ;
    }

    /**
     * 代码生成策略配置 Builder
     */
    public IConfigBuilder<StrategyConfig> strategyConfigBuilder() {

        return new StrategyConfig.Builder()
            //.disableSqlFilter()// 禁用sql过滤
            .enableCapitalMode()// 是否大写命名
            //entity配置
            .entityBuilder()// 实体配置构建者
            .enableLombok()// 开启lombok模型
            .versionColumnName("version") //乐观锁数据库表字段
            .logicDeleteColumnName("del_flag")//逻辑删除字段名(数据库)
            .naming(NamingStrategy.underline_to_camel)// 数据库表映射到实体的命名策略
            .addTableFills(new Column("create_time", FieldFill.INSERT))	//基于数据库字段填充
            .addTableFills(new Column("update_time", FieldFill.INSERT_UPDATE))	//基于数据库字段填充
            .idType(IdType.ASSIGN_UUID)//主键生成方式
            .enableTableFieldAnnotation()//开启生成实体时生成字段注解

            //controller配置
            .controllerBuilder() //控制器属性配置构建
            .enableRestStyle()//开启生成@RestController控制器
            .enableHyphenStyle()//开启驼峰转连字符

            //service配置
//            .serviceBuilder()

            //Mapper配置
//            .mapperBuilder()

            ;
    }

    /**
     * 代码生成，模板引擎
     */
    public AbstractTemplateEngine templateEngine() {
        return null;
    }
}
